package com.learning.spring.ioc.bean.xml.manager;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * ClassName: BeanLifeCycle
 * Description: Bean 在 ApplicationContext 容器中简单生命周期
 * 1、默认容器初始化就会加载
 * 2、指定懒加载
 * Date: 2018/7/26 9:50 【需求编号】
 *
 * @author Sam Sho
 * @version V1.0.0
 */
public class BeanLifeCycle {
    public void main(String[] args) {

//        beanLifeCycle.test();
//        beanLifeCycle.testLazy();
        testWithPrototype();
        test4();
    }

    /**
     * 默认 容器启动时初始化Bean
     */
    void test() {
        // 手动初始化Bean容器
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
        // 输出： 我被实例化了
    }


    /**
     * Bean节点的<bean lazy-init="true"></bean>来延迟初始化Bean,
     * 这时候，只有第一次获取Bean 时才会初始化Bean
     * <p>
     * 如果想对所有bean 都应用延迟初始化，可以在根节点<beans default-lazy-init="true"></beans>
     */
    void testLazy() {
        // 手动初始化Bean容器
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
        // 用到的时候（getBean）实例化
        ManagerBean managerBean = context.getBean("managerBean", ManagerBean.class);
        managerBean.save();
    }

    /**
     * scope="prototype"，默认懒加载。并且没法修改（ lazy-init="false" 无效）
     */
    void testWithPrototype() {
        // 手动初始化Bean容器
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
        // 用到的时候（getBean）实例化
        ManagerBean managerBean = context.getBean("managerBean", ManagerBean.class);
        managerBean.save();
    }

    /**
     * 指定init-method=""初始化方法，在构造函数之后
     * destroy-method="" 指定销毁方法
     */
    void test4() {
        // 手动初始化Bean容器
        ApplicationContext context = new ClassPathXmlApplicationContext("spring-context.xml");
        ManagerBean managerBean = context.getBean("managerBeanInitAndDestroy", ManagerBean.class);
        managerBean.save();
        // 容器销毁
        ((ClassPathXmlApplicationContext) context).close();

        /*
        我被实例化了
        初始化方法
        ~~ save 方法 ~~
        销毁方法
        */

    }
}
